%-----------------------------------------------------
% Dispositivos Semiconductores 66.25/86.03
% TP 1 - Curvas características del transistor MOSFET
% Alumnos:
% 	*
%	* 91523 Vazquez, Matias Fernando
%-----------------------------------------------------


%---------------------------------------------------------------------------------------------------------------
% Grafico de la corriente ID en funcion de VDS, para VGS constante
%---------------------------------------------------------------------------------------------------------------


function graficarVd25P(directorio)

V=-5:0.1:0;

simulacion1 = dlmread(strcat(directorio, 'simulacion.txt'),'\t',1,0);
medicion1 = dlmread(strcat(directorio, 'medicion1.txt'),'\t',1,0);
medicion2 = dlmread(strcat(directorio, 'medicion2.txt'),'\t',1,0);
medicion3 = dlmread(strcat(directorio, 'medicion3.txt'),'\t',1,0);
medicion4 = dlmread(strcat(directorio, 'medicion4.txt'),'\t',1,0);
medicion5 = dlmread(strcat(directorio, 'medicion5.txt'),'\t',1,0);
simulacion2 = dlmread(strcat(directorio, 'simulacion2.txt'),'\t',1,0);
% '\t'="TAB"; como la primer fila es el encabezado, se omite esta fila en la lectura
simulacion1(:,2)=simulacion1(:,2)*1000;	% Normalización a mA
simulacion2(:,2)=simulacion2(:,2)*1000;

%-----------------------------------------------------      
% Ajuste de la corriente de saturacion de los MOSFET
% El objetivo del ajuste mediante 'fminserach' y la funcion auxiliar 'A_x_mas_B'
% es minimizar iterativamente el error cuadratico entre los valores de ID 
% medidos y el resultado de A*VDS+B , donde A y B son los parametros de ajuste
% Condiciones iniciales del ajuste elegidas: A=0.04 (kOhm^-1) y B=1 (mA)
% NOTA: observar que en el ajuste se utilizan ambas columnas, pero sólo se utilizan 
% algunas de las filas de los datos
Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],simulacion1(1:15,:)');
ro_simulacion1=1/Param(1)
ID_simulacion1=Param(2)
lambda_simulacion1=(1/ro_simulacion1)/(ID_simulacion1)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],medicion1(1:7,:)');
ro_medicion1=1/Param(1)
ID_medicion1=Param(2)
lambda_medicion1=(1/ro_medicion1)/(ID_medicion1)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],medicion2(1:7,:)');
ro_medicion2=1/Param(1)
ID_medicion2=Param(2)
lambda_medicion2=(1/ro_medicion2)/(ID_medicion2)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],medicion3(1:7,:)');
ro_medicion3=1/Param(1)
ID_medicion3=Param(2)
lambda_medicion3=(1/ro_medicion3)/(ID_medicion3)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],medicion4(1:7,:)');
ro_medicion4=1/Param(1)
ID_medicion4=Param(2)
lambda_medicion4=(1/ro_medicion4)/(ID_medicion4)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],medicion5(1:7,:)');
ro_medicion5=1/Param(1)
ID_medicion5=Param(2)
lambda_medicion5=(1/ro_medicion5)/(ID_medicion5)

Param=fminsearch('A_x_mas_B',[0.04 1],[0,0.0001,0,0,0,0,0,0,0,],[],simulacion2(1:15,:)');
ro_simulacion2=1/Param(1)
ID_simulacion2=Param(2)
lambda_simulacion2=(1/ro_simulacion2)/(ID_simulacion2)

%-----------------------------------------------------
%Gráfico de las curvas de los MOSFET
figure
hold on
plot(simulacion1(:,1),simulacion1(:,2),'b*','Markersize',5)
plot(V(1:28),((V/ro_simulacion1)+ID_simulacion1)((1:28)),'b-','Linewidth',2)

plot(medicion1(:,1),medicion1(:,2),'r*','Markersize',5)
plot(V(1:22),((V/ro_medicion1)+ID_medicion1)(1:22),'r-','Linewidth',2)

plot(medicion2(:,1),medicion2(:,2),'g*','Markersize',5)
plot(V(1:22),((V/ro_medicion2)+ID_medicion2)(1:22),'g-','Linewidth',2)

plot(medicion3(:,1),medicion3(:,2),'c*','Markersize',5)
plot(V(1:22),((V/ro_medicion3)+ID_medicion3)(1:22),'c-','Linewidth',2)

plot(medicion4(:,1),medicion4(:,2),'m*','Markersize',5)
plot(V(1:22),((V/ro_medicion4)+ID_medicion4)(1:22),'m-','Linewidth',2)

plot(medicion5(:,1),medicion5(:,2),'k*','Markersize',5)
plot(V(1:22),((V/ro_medicion5)+ID_medicion5)(1:22),'k-','Linewidth',2)

plot(simulacion2(:,1),simulacion2(:,2),'y*','Markersize',5)
plot(V(1:28),((V/ro_simulacion2)+ID_simulacion2)(1:28),'y-','Linewidth',2)


legend('simulacion CB4007', sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_simulacion1, ro_simulacion1), 
	   '1er transistor integrado 1',sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_medicion1, ro_medicion1),
	   '2do transistor integrado 1',sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_medicion2, ro_medicion2),
	   '3er transistor integrado 1',sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_medicion3, ro_medicion3),
	   '1er transistor integrado 2',sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_medicion4, ro_medicion4), 
	   '1er transistor integrado 3',sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_medicion5, ro_medicion5),
	   'modelo propio', sprintf('ajuste con ID = %f mA y ro = %f V/mA',ID_simulacion2, ro_simulacion2),
	   'Location','NorthWest')
%-----------------------------------------------------
%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Tension V_{DS} [Volts]')
ylabel('Corriente I_D [mA]')
axis([-5 0 -3 0])
grid minor

print('P_ID_VDS_2500.png','-dpng');
